#include "tabamm.h"

TabAmm::TabAmm(Tabwidget* t, QPushButton* amm, Legami* l,QSqlDatabase* db, bool fb): Tab(t,l,db), amm(amm), fromboard(fb)
{
    init_tab();
}

void TabAmm::horizontal_bar_choice()
{
    hgc = new QGroupBox();
    layout = new QGridLayout;

    newammAction= new QPushButton("Nuova Azione", this);
    newammAction->hide();

    bd->hide();
    sc->hide();
    sc2->hide();
    faceb->hide();
    twitt->hide();
    registro->hide();
    alert->hide();

    layout->addWidget(label1, 0,1, Qt::AlignRight | Qt::AlignBottom);
    layout->addWidget(le1, 0,2, Qt::AlignLeft | Qt::AlignBottom);
    layout->addWidget(label2, 1,1, Qt::AlignRight | Qt::AlignTop);
    layout->addWidget(le2, 1,2, Qt::AlignLeft | Qt::AlignTop);
    layout->addWidget(accedi, 2,2,Qt::AlignLeft | Qt::AlignBottom);
    layout->addWidget(alert,3,2, Qt::AlignCenter);

    //dimensione colonne
    layout->setColumnStretch(0,10);
    layout->setColumnStretch(1, 30);
    layout->setColumnStretch(2, 30);
    layout->setColumnStretch(3, 10);
    layout->setColumnStretch(4,10);
    layout->setColumnStretch(5,10);

    //dimensione righe
    layout->setRowStretch(0,1);
    layout->setRowStretch(1,1);
    layout->setRowStretch(2, 5);
    layout->setRowStretch(3,20);
    layout->setRowStretch(4, 5);

    connect(newammAction, SIGNAL(clicked()), this, SLOT(tabba()));

    hgc->setLayout(layout);

    accedi->setEnabled(false);

    connect(le1, SIGNAL(textChanged(QString)), this, SLOT(userinsert(QString)));
    connect(le2, SIGNAL(textChanged(QString)), this, SLOT(pwdinsert(QString)));

    if(!fromboard){ //login gia' effettuato ->Nuova Azione
        mainmenu();
    }
}

bool TabAmm::sortAcc(int& maxrow, int& row){
    if(profac.count()%2==0)  //se il numero e' pari il numero massimo di righe sara' la meta' del numero (dato che ci son due colonne)
                        //piu' due perche' si parte da row=2
        maxrow= profac.count()/2+2;
    else                //altrimenti dovro' aggiungere 1 perche' se il numero e' dispari la meta' (essendo un intero) risultera'
                        //essere x-1! Cosi' e' per visualizzarli tutti!
        maxrow= profac.count()/2+3;

    if(!profac.isEmpty()){    //riordino profac
        QMap<QPushButton*, Account*>::const_iterator i = profac.constBegin();
        for(; row<maxrow && i!=profac.constEnd(); row++){
            for(int column=1; column<3 && i!=profac.constEnd(); column++){
                layout->addWidget(i.key(),row,column, Qt::AlignTop);
                i++;
            }
        }
        return true;
    }
    return false;
}

bool TabAmm::sortGru(int& maxrow, int& row){    //diverso da sortG in quanto questo,usato solo nell'area amministratore,deve mostrare
                                                //(tutti!) i risultati mediante una grafica diversa, divisa in 2 colonne.
    if(g.count()%2==0)  //se il numero e' pari il numero massimo di righe sara' la meta' del numero (dato che ci son due colonne)
                        //piu' due perche' si parte da row=2
        maxrow= g.count()/2+2;
    else                //altrimenti dovro' aggiungere 1 perche' se il numero e' dispari la meta' (essendo un intero) risultera'
                        //essere x-1! Cosi' e' per visualizzarli tutti!
        maxrow= g.count()/2+3;

    if(!g.isEmpty()){    //riordino g
        QMap<QPushButton*, Gruppo*>::const_iterator i = g.constBegin();
        for(; row<maxrow && i!=g.constEnd(); row++){
            for(int column=1; column<3 && i!=g.constEnd(); column++){
                layout->addWidget(i.key(),row,column, Qt::AlignTop);
                i++;
            }
        }
        return true;
    }
    return false;
}

void TabAmm::showprofile(User* prof_u){
    Tab::showprofile(prof_u);

    newammAction->show();
    delacc->setText("Elimina Account");
    delacc->show();

    layout->addWidget(delacc,0,4);

    int numrow= layout->rowCount();

    layout->addWidget(newammAction, numrow,4, Qt::AlignRight);
    layout->addWidget(back, numrow,0,Qt::AlignLeft);


    disconnect(delacc,0,0,0);
    connect(delacc, SIGNAL(clicked()),this,SLOT(deleteacc()));
}

void TabAmm::showprofileBan(User* prof_u){  //showprofile,solo che serve a bannare l'utente da un dato gruppo,non per eliminare
                                            //il suo account
    showprofile(prof_u);
    delacc->setText("Banna Utente dal gruppo");
    delacc->show();

    disconnect(delacc,0,0,0);
    connect(delacc, SIGNAL(clicked()), this, SLOT(ban()));
}

void TabAmm::showG(Gruppo* gr){
    Tab::showG(gr);

    QString cg= "Creatore del gruppo: ";
    cg.append(gr->getProp());

    label4->setText(cg);
    label1->setText("Utenti nel gruppo");

    layout->addWidget(groups,1,4);

    newammAction->show();
    back->show();
    groups->show();

    QVector<User*> mem= gr->getMembri();
    profac.clear();
    int row=3;
    for(QVector<User*>::iterator it= mem.begin(); it!= mem.end(); it++){
            QPushButton* pb= new QPushButton((*it)->getNome().append(" ").append((*it)->getCognome()));
            int s= (*it)->getGender();
            pbicon(pb,s);
            Account* acc= gestore->getAcc((*it));  //mi ricavo l'account relativo di User in legami, per andar meglio a fare i
                                                    //controlli se un membro di gruppo e' stato cambiato o upgradato
            profac.insert(pb,acc);
            connect(pb, SIGNAL(pressed()), this, SLOT(showuser()));
        }

    if(!sortPA(row))   //riordino profac
        label3->setText("Non ci sono altri utenti");

    int numrows= layout->rowCount();
    layout->addWidget(back, numrows, 0, Qt::AlignLeft);
    layout->addWidget(newammAction, numrows, 4, Qt::AlignRight);
    dim_row(row,numrows);   //ridimensiono righe

    disconnect(groups,0,0,0);
    connect(groups, SIGNAL(clicked()), this, SLOT(eraseGr()));
}

int TabAmm::tryGru(Gruppo* gru){
    //(1 non c'e' gruppo, 2 no problem) e coun uno switch al ritorno faccio quel che devo fare!
    try {gestore->foundgruppo(gru);} //controllo che il gruppo esista ancora
    catch(logic_error){    //...se non esiste piu'
        QMessageBox::about(this,"ERRORE","Attenzione! Questo gruppo non esiste piu'");
        return 1;    //evitare seguenti
    }
    return 2;
}

void TabAmm::step2(){
    hideAll();
    label1->setText("Step 2");
    label1->show();
    label3->setText("Seleziona l'utente da bannare");
    label3->show();
    back->show();

    QVector<User*> risultato= grcurr->getMembri();
    profac.clear();
    int row=2;
    for(QVector<User*>::iterator it= risultato.begin(); it!= risultato.end(); it++){
            Account* acc= gestore->getAcc(*it);
            QPushButton* pb= new QPushButton(acc->getNome().append(" ").append(acc->getCognome()));
            int s= acc->getGender();
            pbicon(pb,s);
            profac.insert(pb,acc);
            connect(pb, SIGNAL(pressed()), this, SLOT(step2b())); //cambiare questa connect. PERCHE'??
        }
    int maxrow;
    if(!sortAcc(maxrow,row))
        label3->setText("Nessun utente in questo gruppo!");
}

void TabAmm::AmmUs(){
    mainmenu();
}

void TabAmm::mainmenu(){
    hideAll();
    QFont font= label1->font();
    font.setPointSize(28);
    label1->setFont(font);
    font= label3->font();
    font.setPointSize(13);
    font.setItalic(true);
    label3->setFont(font);
    icona->hide();
    int index= tabbed->indexOf(this);
    tabbed->setTabText(index, "Amministrazione");
    newammAction->setEnabled(true);
    delacc->setText("Elimina Account");
    groups->setText("Elimina Gruppo");
    groups->setIcon(QIcon("icons/erasegruppo.png"));
    contacts->setText("Banna utente da gruppo");
    contacts->setIcon(QIcon("icons/remove_friend.png"));
    upgrade->setText("Azzera il database di Legami");
    upgrade->setIcon(QIcon("icons/warning.png"));
    delacc->show();
    groups->show();
    contacts->show();
    upgrade->show();
    back->show();
    newammAction->show();
    searchacc->show();
    searchgru->show();
    back->setEnabled(false);
    layout->addWidget(delacc, 0,1);
    layout->addWidget(groups, 0,2);
    layout->addWidget(contacts, 2,1);
    layout->addWidget(upgrade, 2,2);
    layout->addWidget(searchacc,4,1);
    layout->addWidget(searchgru,4,2);
    int numrows= layout->rowCount();
    layout->addWidget(back,numrows+1,0,Qt::AlignLeft);
    layout->addWidget(newammAction,numrows+1,4, Qt::AlignRight);
    //uniformo la grandezza delle righe
    dim_row(4, numrows);

    connect(back,SIGNAL(clicked()),this,SLOT(mainmenu()));
    disconnect(groups,0,0,0);
    connect(groups, SIGNAL(clicked()), this, SLOT(showgroups()));
    disconnect(delacc,0,0,0);
    connect(delacc, SIGNAL(clicked()), this, SLOT(showusers()));
    connect(contacts, SIGNAL(clicked()), this, SLOT(step1()));
    connect(upgrade,SIGNAL(clicked()), this, SLOT(confirm()));
    disconnect(searchacc,0,0,0);
    connect(searchacc, SIGNAL(clicked()), this, SLOT(cercaUser_g()));
    disconnect(searchgru,0,0,0);
    connect(searchgru,SIGNAL(clicked()), this,SLOT(cercaGruppo_g()));
}

void TabAmm::login(){
    QString username= le1->text();
    QString pwd= le2->text();
    if(gestore->aut(username,pwd)){
        mainmenu();
    }
    else{
        alert->setText("Accesso negato!");  //25 Luglio
        alert->show();
        newammAction->setEnabled(false);
    }
}

void TabAmm::tabba(){
    Tab* tab;
    if(tabbed->count()>0){  //se c'e' piu' di una tab, rendo possibile la chiusura da tab
        tabbed->setTabsClosable(true);
    }
    tab= new TabAmm(tabbed, amm, gestore,db,0);
    tabbed->addTab(tab, "Amministrazione");
    tabbed->setCurrentIndex(tabbed->indexOf(tab));

    connect(tabbed, SIGNAL(tabCloseRequested(int)), tab, SLOT(removeatab(int)));
}

void TabAmm::closetab(){
    if(tabbed->close()) //se chiudo tabbed...
        amm->setEnabled(true); //riattivo relativo pushbutton
}

void TabAmm::showusers(){   //duale di showgroups
    hideAll();
    back->show();
    back->setEnabled(true);
    label1->setText("Elimina Account");
    label1->show();
    layout->addWidget(label1, 0, 1, 1, 2, Qt::AlignCenter);

    QVector<Account*> risultato= gestore->getUtenti();
    profac.clear();
    int row= 2;
    for(QVector<Account*>::iterator it= risultato.begin(); it!= risultato.end(); it++){
        QPushButton* pb= new QPushButton((*it)->getNome().append(" ").append((*it)->getCognome()));
        int s= (*it)->getGender();
        pbicon(pb,s);
        profac.insert(pb,(*it));
        connect(pb, SIGNAL(pressed()), this, SLOT(showuser()));
    }
    int maxrow;
    if(!sortAcc(maxrow,row)){
        label3->setText("Nessun utente presente!");
        label3->show();
        layout->addWidget(label3, 1,1,1,2, Qt::AlignTop | Qt::AlignCenter);
    }
    int numrows= layout->rowCount();
    layout->addWidget(back,numrows, 0, Qt::AlignLeft);
    layout->addWidget(newammAction, numrows, 4, Qt::AlignRight);
    dim_row(maxrow-1,numrows);  //nel for arrivo fino a row<maxrow(cioe' <=maxrow-1) quindi devo ridimensionare fino a maxrow-1
}

void TabAmm::showgroups(){
    hideAll();
    back->show();
    back->setEnabled(true);
    label1->setText("Elimina Gruppo");
    label1->show();
    layout->addWidget(label1, 0, 1, 1, 2, Qt::AlignCenter);

    QVector<Gruppo*> risultato= gestore->getGruppi();
    g.clear();
    int row= 2;
    for(QVector<Gruppo*>::iterator it= risultato.begin(); it!= risultato.end(); it++){
        QPushButton* pb= new QPushButton((*it)->getNome());
        g.insert(pb,(*it));
        connect(pb, SIGNAL(pressed()), this, SLOT(showgroup()));
    }
    int maxrow;
    if(!sortGru(maxrow,row)){
        label3->setText("Nessun gruppo presente!");
        label3->show();
        layout->addWidget(label3, 1,1,1,2, Qt::AlignTop | Qt::AlignCenter);
    }
    int numrows= layout->rowCount();
    layout->addWidget(back,numrows, 0, Qt::AlignLeft);
    layout->addWidget(newammAction, numrows, 4, Qt::AlignRight);
    dim_row(maxrow-1,numrows); //nel for arrivo fino a row<maxrow(cioe' <=maxrow-1) quindi devo ridimensionare fino a maxrow-1
}

void TabAmm::ban(){
    switch(Tab::tryGru(grcurr)){//quello di Tab perche' quello di TabAmm non contempla il controllo su current
    case 0:
        mainmenu();
        return;
    case 1:
        step1();
        return;
    case 2:
        //banno!
        current->eraseGruppo(grcurr);
        grcurr->deleteUser(current);
        //Su database
        QSqlQuery query(*db);
        db->transaction();
        query.prepare("Delete from gruppi where(username=:user and id_group=:id)");
        query.bindValue(":user", current->getNick());
        query.bindValue(":id", grcurr->getId());
        query.exec();
        db->commit();
        QString avviso("L'utente ");
        avviso.append(current->getNome()).append(" ").append(current->getCognome()).append(" e' stato bannato dal gruppo ");
        avviso.append(grcurr->getNome());
        QMessageBox::about(this,"Operazione riuscita",avviso);
        mainmenu();
    }
}

void TabAmm::step1(){
    hideAll();
    label1->setText("Step 1");
    label1->show();
    label3->setText("Seleziona il gruppo");
    label3->show();
    layout->addWidget(label1, 0, 1, 1, 2, Qt::AlignCenter);
    layout->addWidget(label3, 1, 1, 1, 2, Qt::AlignCenter);
    back->show();
    back->setEnabled(true);
    icona->hide();

    QVector<Gruppo*> risultato= gestore->getGruppi();
    g.clear();
    int row= 2;
    for(QVector<Gruppo*>::iterator it= risultato.begin(); it!= risultato.end(); it++){
        QPushButton* pb= new QPushButton((*it)->getNome());
        g.insert(pb,(*it));
        connect(pb, SIGNAL(pressed()), this, SLOT(step1b()));
    }
    int maxrow;
    if(!sortGru(maxrow,row))
        label3->setText("Nessun gruppo presente!");
}

void TabAmm::step1b(){
    QMap<QPushButton*, Gruppo*>::const_iterator i = g.constBegin();
     while (i != g.constEnd()){
         if(i.key()->isDown()){
             cercaProfiloGBan(i.value());
             return;
         }
         else ++i;
     }
}

void TabAmm::step2b(){
    QMap<QPushButton*, Account*>::const_iterator i = profac.constBegin();
     while (i != profac.constEnd()) {
         if(i.key()->isDown()){
             cercaProfiloUBan(i.value());
             return;
         }
         else ++i;
     }
}

void TabAmm::confirm(){
    Tab::confirm();
    label1->setText("Azzeramento database");
    alert->setText("\nATTENZIONE.\n\nHai scelto di azzerare il database\ndi Legami.\n\nProcedere?\n");
    newammAction->show();
    disconnect(accedi,0,0,0);
    connect(accedi, SIGNAL(clicked()), this, SLOT(reset()));
    disconnect(registro,0,0,0);
    connect(registro,SIGNAL(clicked()), this, SLOT(mainmenu()));
}

void TabAmm::reset(){
    gestore->clear();
    //ora in Database
    QSqlQuery query(*db);
    db->transaction();
    query.exec("Delete from utenti");
    query.exec("Delete from contatti");
    query.exec("Delete from gruppi");
    query.exec("Delete from info");
    db->commit();
    QMessageBox::about(this,"Azzeramento database di Legami","Operazione terminata con successo");
    mainmenu();
}

void TabAmm::cercaUser_g(){ //devo modificare il layout
    Tab::cercaUser_g();
    layout->addWidget(label1, 0,1,Qt::AlignCenter);
    layout->addWidget(src1, 2,0);
    layout->addWidget(src2, 3,0);
    layout->addWidget(src3, 4,0);
    layout->addWidget(le1, 2,1);
    layout->addWidget(le2, 3,1);
    layout->addWidget(le3, 4,1);
    layout->addWidget(search, 5,1,Qt::AlignCenter);
}

void TabAmm::query(){
    QString nome= le1->text();
    QString cognome= le2->text();
    QString username= le3->text();
    QVector<Account*>* risultato= new QVector<Account*>();
    risultato= gestore->searchU(0,nome,cognome,username);
    //Questa "funzione" qui sotto e' gia' stata usata,ma non posso riutilizzarla perche' cambia qualcosa. Devo riscrivermela!
    profac.clear();
    int row=3;
    for(QVector<Account*>::iterator it= risultato->begin(); it!= risultato->end(); it++){
            QPushButton* pb= new QPushButton((*it)->getNome().append(" ").append((*it)->getCognome()));
            int s= (*it)->getGender();
            pbicon(pb,s);
            profac.insert(pb,(*it));
            connect(pb, SIGNAL(pressed()), this, SLOT(showuser()));
        }

    if(!sortPA(row))   //riordino profac
        label3->setText("Nessun risultato corrispondente alla tua ricerca."
                        "\nVerifica l'ortografia o prova con un altro termine.");

    label1->setText("Risultato della ricerca");
    label1->show();
    layout->addWidget(label1, 0,1, Qt::AlignCenter);
    back->show();
}

void TabAmm::queryg(){
    QString id= le1->text();
    QString nome= le2->text();
    QString prop= le3->text();
    QVector<Gruppo*>* risultato= new QVector<Gruppo*>();
    risultato= gestore->searchG(0,id,nome,prop);
    g.clear();
    int row= 2;
    for(QVector<Gruppo*>::iterator it= risultato->begin(); it!= risultato->end(); it++){
        QPushButton* pb= new QPushButton((*it)->getNome());
        g.insert(pb,(*it));
        connect(pb, SIGNAL(pressed()), this, SLOT(showgroup()));
    }
    sortG(row);
    label1->setText("Risultato della ricerca");
    label1->show();
    back->show();
}

void TabAmm::cercaProfiloU(Account* acc){
    current=acc;
    switch(tryAcc(acc)){
    case 0:
        mainmenu();
        return;
    case 1:
        cercaUser_g();
        return;
    case 2:
        showprofile(current);
        return;
    }
}

void TabAmm::cercaProfiloG(Gruppo* gr){
    switch(tryGru(gr)){
    case 0:
        mainmenu();
        return;
    case 1:
        showgroups();
        return;
    case 2:
        grcurr= gr;
        showG(grcurr);
        return;
    }
}

void TabAmm::cercaProfiloUBan(Account* acc){
    current=acc;
    switch(tryAcc(acc)){
    case 0:
        mainmenu();
        return;
    case 1:
        step2();
        return;
    case 2:
        showprofileBan(current);
        return;
    }
}

void TabAmm::cercaProfiloGBan(Gruppo* gr){  //da usare al posto della precedente nel caso di dover bannare utente dal gruppo!
    switch(tryGru(gr)){
    case 0:
        mainmenu();
        return;
    case 1:
        step1();
        return;
    case 2:
        grcurr= gr;
        step2();
        return;
    }
}
